package com.gbas.mus.model;

import com.gbas.mus.model.lances.*;

public class FaseJuego extends Fase {
    int jugadoresConJuego = 0;

    public FaseJuego(Ronda ronda) {
        super(ronda);

        // Check Pares en ambos equipos
        boolean juegoEquipo[] = new boolean[2];

        getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, "Comienza fase Juego");

        JugadorMus jugardor = jugs().getJugador();
        for (int k = 0; k < 4; k++) {
            if (hayJuego(jugardor.getNaipes())) {
                getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, jugardor.getNombre() + " Tiene juego");
                jugadoresConJuego++;
                juegoEquipo[jugardor.getEquipo()] = true;
            } else {
                getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, jugardor.getNombre() + " no Tiene juego");
            }
            jugardor = jugs().getNextJugador(jugardor);
        }
        if (juegoEquipo[0] && juegoEquipo[1]) {
            // Se juega, hay juego en ambos equipos
            jugardor = jugs().getJugador();
            for (int k = 0; k < 4; k++) {
                if (hayJuego(jugardor.getNaipes())) {
                    permiteAccion(jugardor, OP_INPUT.APUESTA);
                    break;
                }
                jugardor = jugs().getNextJugador(jugardor);
            }
        } else if (juegoEquipo[0] && !juegoEquipo[1]) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, "Solo el Equipo 1 tiene juego");
            limpiaAccion();
//            ronda.nuevaFase(new FaseConteo(ronda));
        } else if (!juegoEquipo[0] && juegoEquipo[1]) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, "Solo el Equipo 2 tiene juego");
            limpiaAccion();
            //ronda.nuevaFase(new FaseConteo(ronda));
        } else {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, "Nadie teine juego... al punto !");
            turnoAMano(OP_INPUT.APUESTA);
        }

    }

    void nextFase() {
        final FaseConteo conteo = new FaseConteo(ronda);
        ronda.nuevaFase(conteo);

    }

    public boolean lanceValido(Lance lance) {
        return esLanceDeJuego(lance);
    }

    public void doLance(Lance lance) {
        if (lance instanceof LanceAceptoOrdago) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " acepta el Ordago a Juego");
            ronda.nuevaFase(new FaseConteo(ronda, true));
        } else if (lance instanceof LanceOrdago) {
            if (alPunto()) {
                getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " se juega un Ordago al Punto");
                turnoASiguientePareja(lance.getJugador(), OP_INPUT.RESPUESTA_ORDAGO);
            } else {
                getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " se juega un Ordago a Juego");
                turnoASiguienteParejaJuego(lance.getJugador(), OP_INPUT.RESPUESTA_ORDAGO);
            }
        } else if (lance instanceof LancePaso) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " pasa");
            turnoPara.remove(lance.getJugador());
            if (turnoPara.size() == 0) {
                if (hayNoPasos()) {
                    if (sumaPuntosPorJinete()) {
                        nextFase();
                    } else {
                        nextFase();
                    }
                } else {
                    // Solo son pasos, si son X, se pasa
                    if (lances.size() == (alPunto() ? 4 : jugadoresConJuego)) {
                        getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, "se fu�");
                        nextFase();
                    } else {
                        if (alPunto()) {
                            turnoASiguienteJugador(lance.getJugador(), OP_INPUT.APUESTA);
                        } else {
                            turnoASiguienteJugadorConJuego(lance.getJugador(), OP_INPUT.APUESTA);
                        }
                    }
                }
            }
        } else if (lance instanceof LanceEnvido) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " envida 2");
            if (alPunto()) {
                turnoASiguientePareja(lance.getJugador(), OP_INPUT.RESPUESTA);
            } else {
                turnoASiguienteParejaJuego(lance.getJugador(), OP_INPUT.RESPUESTA);
            }
        } else if (lance instanceof LanceVer) {
            getJugarMus().accionMesa(Accion.MENSAJE_TEXTO, lance.getJugador().getNombre() + " las ve");
            nextFase();
        }
    }

    public String getNombre() {
        return "Juego";
    }

    public boolean alPunto() {
        return jugadoresConJuego == 0;
    }
}
